package entity;

import java.io.Serializable;
import java.util.List;

import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Transient;
import javax.validation.constraints.Size;

import org.hibernate.annotations.CollectionOfElements;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;

import enumeration.CategoriaPessoaEnum;
import enumeration.TipoPessoaEnum;

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "tipoPessoa", discriminatorType = DiscriminatorType.STRING)
public class Pessoa extends EntityManaged implements Serializable {

	private static final long serialVersionUID = -6398783154217336200L;

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;
	@NotEmpty
	private String nome;

	private String foneComercial;
	private String foneResidencial;
	private String foneCelular;

	@CollectionOfElements(targetElement = CategoriaPessoaEnum.class)
	@Enumerated(EnumType.ORDINAL)
	@Size(max = 4, min = 1)
	private List<CategoriaPessoaEnum> listaCategoriaPessoa;

	@Email
	private String email;

	@Override
	public Long getId() {
		return id;
	}

	public String getFoneComercial() {
		return foneComercial;
	}

	public void setFoneComercial(String foneComercial) {
		this.foneComercial = foneComercial;
	}

	public String getFoneResidencial() {
		return foneResidencial;
	}

	public void setFoneResidencial(String foneResidencial) {
		this.foneResidencial = foneResidencial;
	}

	public String getFoneCelular() {
		return foneCelular;
	}

	public void setFoneCelular(String foneCelular) {
		this.foneCelular = foneCelular;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public void setId(Long id) {
		this.id = id;
	}

	@Transient
	public final TipoPessoaEnum getTipoPessoa() {
		return this instanceof PessoaFisica ? TipoPessoaEnum.FISICA
				: TipoPessoaEnum.JURIDICA;
	}

	public List<CategoriaPessoaEnum> getListaCategoriaPessoa() {
		return listaCategoriaPessoa;
	}

	public void setListaCategoriaPessoa(
			List<CategoriaPessoaEnum> listaCategoriaPessoa) {
		this.listaCategoriaPessoa = listaCategoriaPessoa;
	}

}
